/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package persistencia;

import java.sql.*;
import controlador.*;
import Util.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 *
 * @author JAVA
 */
public class PersistenciaMensajes extends PersistenciaConexion {

    public static int getMaxId() {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        int idMax = -1;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("select max(IdMensaje) Idmax from mensajes;");
            if (rs.first()) {
                idMax = rs.getInt("Idmax");
            }
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return idMax;
        }
    }

    public static List<Mensaje> recuperarMensajes(String usuario) {

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        List<Mensaje> mensajes = new ArrayList();
        Mensaje mensaje;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("SELECT * FROM mensajes WHERE usuarioEnvia = '" + usuario + "' AND estado='alta' AND nivel='sup'");
            while (rs.next()) {
                mensaje = new Mensaje(rs.getInt("idMensaje"), rs.getString("contenido"), rs.getString("usuarioEnvia"), "sup");
                mensajes.add(mensaje);
            }

            // Recuperar submensajes
            recuperarSubMensajes(mensajes);

            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return mensajes;
        }
    }

    public static void recuperarSubMensajes(List<Mensaje> mensajes) {
        List <String> idsSubMensajes = new ArrayList();
        
        List <Mensaje> lstMensajes = new ArrayList();
        
        ///////////////// DEBUG
//        Mensaje men = new Mensaje();
//        
//        idsSubMensajes = recuperarIdsSubmensajes(89);
//        
//        men = recuperarMensajePorId("89");
        ///////////////// FIN DEBUG
        
        for (Mensaje m : mensajes) {
            idsSubMensajes = recuperarIdsSubmensajes(m.getId());
            lstMensajes = new ArrayList();
            
            for (String id: idsSubMensajes){
                lstMensajes.add(recuperarMensajePorId(id));
                
            }
            
            m.setSubMensajes(lstMensajes);
        }
    }

    public static List<String> recuperarIdsSubmensajes(int IdMensaje) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        List<String> idsMensajesHijos = new ArrayList();

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("select idMensajeHijo from submensajes where idMensajePadre=" + IdMensaje);
            while (rs.next()) {
                idsMensajesHijos.add(Integer.toString(rs.getInt("idMensajeHijo")));
            }

            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return idsMensajesHijos; // Parece que no devuelve esto!!
        }
    }

    public static Mensaje recuperarMensajePorId(String id) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;


        Mensaje mensaje = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("SELECT * FROM mensajes WHERE idMensaje = " + id + " AND estado='alta' ");
            while (rs.next()) {
                mensaje = new Mensaje(rs.getInt("idMensaje"), rs.getString("contenido"), rs.getString("usuarioEnvia"), rs.getString("nivel"));
                // mensajes.add(mensaje);
            }

            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return mensaje;
        }

    }

    public static void registraMsg(Mensaje msg) {
        Connection con = null;
        Statement st = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            st.executeUpdate("INSERT INTO mensajes (usuarioEnvia,fechaMensaje,contenido,estado,nivel) VALUES ('" + msg.getUsuario() + "','" + Util.UtilFecha.fechaMySQL(msg.getFechaCreacion()) + "','" + msg.getContenido() + "','alta','" + msg.getNivel() + "')");

            st.close();

        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

    public static void registrarSubMsg(int idPadre, int idHijo) {
        Connection con = null;
        Statement st = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            st.executeUpdate("INSERT INTO submensajes (idMensajePadre,idMensajeHijo) VALUES (" + idPadre + "," + idHijo + ")");

            st.close();

        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

    public static boolean darAltaMensaje(String idMensaje) {

        boolean res = false;
        Connection con = null;
        Statement st = null;

        try {
            crearConexion();
            int rowcount = st.executeUpdate("UPDATE  mensajes SET "
                    + "estado = 'alta' " + "WHERE idMensaje = " + idMensaje);
            if (rowcount == 1) {
                res = true;
            }
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;
    }

    public static boolean darBajaMensaje(String idMensaje) {

        boolean res = false;
        Connection con = null;
        Statement st = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            int rowcount = st.executeUpdate("UPDATE mensajes SET " + "estado = 'baja' " + "WHERE idMensaje = " + idMensaje);
            if (rowcount == 1) {
                res = true;
            }
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;
    }

    public static int mensajesEnviadosA1Amigo(int usuarioEnvia, int usuarioRecibe) {

        Connection con = null;
        Statement st = null;
        int cont = 0;

        try {
            crearConexion();

            ResultSet rs = st.executeQuery("SELECT COUNT (*) AS contador FROM mensajes "
                    + " WHERE usuarioEnvia ='" + usuarioEnvia + "' AND usuarioRecibe ='"
                    + usuarioRecibe + "'");
            cont = rs.getInt("contador");

        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return cont;
    }

    public static int numeroMensajesEn1Fecha(String usuarioEnvia, Date fechaMensaje) {

        Connection con = null;
        Statement st = null;
        int cont = 0;

        try {
            crearConexion();

            ResultSet rs = st.executeQuery("SELECT COUNT (*) AS contador FROM mensajes "
                    + " WHERE usuarioEnvia ='" + usuarioEnvia + "' AND fechaMensaje ='"
                    + fechaMensaje + "'");
            cont = rs.getInt("contador");

        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return cont;
    }
//    public static String estadoMensaje (int idMensaje){
//    
//        Connection con = null;
//        Statement st = null;
//        String estado=null;
//
//        try {
//            crearConexion();
//
//            ResultSet rs = st.executeQuery("SELECT estado as estado FROM mensajes "
//                    + " WHERE idMensaje =" + idMensaje);
//            
//            estado = rs.getString("estado");
//        } catch (Exception e) {
//            System.out.println("ERROR");
//
//        } finally {
//            PersistenciaConexion.cerrarConexion(con);
//        }
//        
//        return estado;
//    }
}
